#!/bin/bash

# Ubuntu ARM Linux 辅助决策系统启动脚本
# 适用于 Ubuntu 20.04+ ARM64 架构

set -e  # 遇到错误时退出

echo "🐧 Ubuntu ARM Linux 辅助决策系统启动脚本"
echo "=========================================="

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查是否为 ARM 架构
check_architecture() {
    log_info "检查系统架构..."
    if [[ $(uname -m) == "aarch64" || $(uname -m) == "arm64" ]]; then
        log_success "检测到 ARM64 架构: $(uname -m)"
    else
        log_warning "当前架构: $(uname -m) - 本脚本专为 ARM64 优化"
    fi
}

# 检查系统要求
check_system_requirements() {
    log_info "检查系统要求..."
    
    # 检查 Ubuntu 版本
    if [[ -f /etc/os-release ]]; then
        source /etc/os-release
        if [[ "$NAME" == "Ubuntu" ]]; then
            log_success "检测到 Ubuntu $VERSION"
        else
            log_warning "当前系统: $NAME $VERSION"
        fi
    fi
    
    # 检查 Python
    if command -v python3.9 &> /dev/null; then
        log_success "Python 3.9 已安装: $(python3.9 --version)"
    elif command -v python3 &> /dev/null; then
        PYTHON_VERSION=$(python3 --version | cut -d' ' -f2)
        log_success "Python 已安装: $PYTHON_VERSION"
    else
        log_error "Python 未安装，请先安装 Python 3.8+"
        exit 1
    fi
    
    # 检查 Node.js
    if command -v node &> /dev/null; then
        log_success "Node.js 已安装: $(node --version)"
    else
        log_error "Node.js 未安装，请先安装 Node.js 16+"
        exit 1
    fi
    
    # 检查 npm
    if command -v npm &> /dev/null; then
        log_success "npm 已安装: $(npm --version)"
    else
        log_error "npm 未安装"
        exit 1
    fi
}

# 检查项目结构
check_project_structure() {
    log_info "检查项目结构..."
    
    if [[ ! -d "backend" ]]; then
        log_error "backend 目录不存在"
        exit 1
    fi
    
    if [[ ! -d "frontend" ]]; then
        log_error "frontend 目录不存在"
        exit 1
    fi
    
    if [[ ! -f "backend/requirements.txt" ]]; then
        log_error "backend/requirements.txt 不存在"
        exit 1
    fi
    
    if [[ ! -f "frontend/package.json" ]]; then
        log_error "frontend/package.json 不存在"
        exit 1
    fi
    
    log_success "项目结构检查通过"
}

# 设置后端环境
setup_backend() {
    log_info "设置后端环境..."
    
    cd backend
    
    # 检查虚拟环境
    if [[ ! -d "venv" ]]; then
        log_info "创建 Python 虚拟环境..."
        python3 -m venv venv
    fi
    
    # 激活虚拟环境
    source venv/bin/activate
    
    # 升级 pip
    log_info "升级 pip..."
    pip install --upgrade pip
    
    # 安装依赖
    log_info "安装 Python 依赖..."
    pip install -r requirements.txt
    
    # 检查环境变量文件
    if [[ ! -f ".env" ]]; then
        if [[ -f "env_example.txt" ]]; then
            log_info "创建环境变量文件..."
            cp env_example.txt .env
            log_warning "请编辑 backend/.env 文件配置您的 API 密钥"
        else
            log_warning "未找到环境变量示例文件"
        fi
    fi
    
    cd ..
    log_success "后端环境设置完成"
}

# 设置前端环境
setup_frontend() {
    log_info "设置前端环境..."
    
    cd frontend
    
    # 检查 node_modules
    if [[ ! -d "node_modules" ]]; then
        log_info "安装 Node.js 依赖..."
        npm install
    else
        log_info "Node.js 依赖已存在，跳过安装"
    fi
    
    cd ..
    log_success "前端环境设置完成"
}

# 检查端口占用
check_ports() {
    log_info "检查端口占用..."
    
    # 检查后端端口
    if netstat -tlnp 2>/dev/null | grep -q ":8000 "; then
        log_warning "端口 8000 已被占用"
        read -p "是否继续启动？(y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
    
    # 检查前端端口
    if netstat -tlnp 2>/dev/null | grep -q ":3000 "; then
        log_warning "端口 3000 已被占用"
        read -p "是否继续启动？(y/N): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            exit 1
        fi
    fi
}

# 启动后端服务
start_backend() {
    log_info "启动后端服务..."
    
    cd backend
    source venv/bin/activate
    
    # 后台启动后端服务
    nohup python main.py > backend.log 2>&1 &
    BACKEND_PID=$!
    echo $BACKEND_PID > backend.pid
    
    cd ..
    
    # 等待服务启动
    sleep 3
    
    # 检查服务状态
    if curl -s http://localhost:8000/health > /dev/null; then
        log_success "后端服务启动成功 (PID: $BACKEND_PID)"
    else
        log_error "后端服务启动失败"
        exit 1
    fi
}

# 启动前端服务
start_frontend() {
    log_info "启动前端服务..."
    
    cd frontend
    
    # 后台启动前端服务
    nohup npm start > frontend.log 2>&1 &
    FRONTEND_PID=$!
    echo $FRONTEND_PID > frontend.pid
    
    cd ..
    
    # 等待服务启动
    sleep 5
    
    # 检查服务状态
    if curl -s http://localhost:3000 > /dev/null; then
        log_success "前端服务启动成功 (PID: $FRONTEND_PID)"
    else
        log_warning "前端服务可能还在启动中，请稍后检查"
    fi
}

# 显示服务信息
show_service_info() {
    echo
    echo "🎉 服务启动完成！"
    echo "=================="
    echo "📊 后端 API: http://localhost:8000"
    echo "🌐 前端应用: http://localhost:3000"
    echo "📚 API 文档: http://localhost:8000/docs"
    echo
    echo "📝 日志文件:"
    echo "   - 后端日志: backend/backend.log"
    echo "   - 前端日志: frontend/frontend.log"
    echo
    echo "🛑 停止服务: ./stop_services.sh"
    echo
}

# 主函数
main() {
    echo "开始启动辅助决策系统..."
    echo
    
    check_architecture
    check_system_requirements
    check_project_structure
    setup_backend
    setup_frontend
    check_ports
    start_backend
    start_frontend
    show_service_info
}

# 错误处理
trap 'log_error "脚本执行失败，请检查错误信息"; exit 1' ERR

# 执行主函数
main "$@"
